﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ShareIt_MVC3.Models;

// Diese Klasse dient zur Kontrolle der einzelnen Views in den Angelegenheiten der Ressourcen im Allgemeinen und zur Weiterleitung auf diese.
namespace ShareIt_MVC3.Controllers
{
    public class ResourcesController : MainController
    {
        
        // GET: /Resources/
        /// <summary>
        ///  Weiterleitung auf die Ressourcen-Übersicht seite und bereitstellen aller Ressourcen für den Admin.
        /// </summary>
        /// <returns></returns>
        [Authorize(Roles="Admin")]
        public ActionResult Index() {
            List<Resource> resources = resColl.GetAllResources();
            return View(resources);
        }

        
        /// <summary>
        /// Weiterleitung der Suche mit such-eingabe. 
        /// </summary>
        /// <param name="searchString"></param>
        /// <returns></returns>
        public ActionResult Search(string searchString)
        {
            ViewBag.searchString = searchString;
            List<Resource> resources = resColl.Search(searchString);
            return View(resources);
        }


        /// <summary>
        /// Zeigt die Details der Ressource an, deren ID übergeben worden ist.
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [Authorize]
        public ActionResult Details(int id)
        {
            return View(resColl.GetResourceByID(id));
        }

        /// <summary>
        /// Anlegen eines Buches.
        /// </summary>
        /// <returns></returns>
        public ActionResult Create()
        {
            Resource resource = new Resource
            {
                Category = "Buch"
            };
            return View(resource);
        }

        /// <summary>
        ///  veruschen ein Buch einzufügen. Dazu wird ein Ressourcen-Objekt übergeben.  Sollte es nicht klappen wird man wieder auf die create-seite verwiesen.
        /// </summary>
        /// <param name="resource"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult Create(Resource resource)
        {
            resource.Owner = userColl.GetUserById(MyUser.ID);
            resource.Category = "Buch";

            try
            {
                resColl.InsertResource(resource);
                userColl.IncrementUserCredits(MyUser);
            }
            catch
            {
                return View("Create");
            }
            return RedirectToAction("Index", "MyResources");
        }

        /// <summary>
        /// Editieren einer Ressource und überprüfen ob Zugriffsberechtigungen vorliegen.
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [Authorize]
        public ActionResult Edit(int id)
        {
            Resource resource = resColl.GetResourceByID(id);
            // Zugriffsberechtigung prüfen
            if (!(MyUser.IsAdmin || resource.Owner.ID == MyUser.ID))
                return View("Shared/_PermissionDenied");
            
            return View(resource);
        }

        /// <summary>
        /// Anlegen des Views zum editieren von Büchern.
        /// </summary>
        /// <param name="id"></param>
        /// <param name="resource"></param>
        /// <returns></returns>
        [Authorize]
        [HttpPost]
        public ActionResult Edit(int id, Resource resource)
        {
            Resource currentResource = resColl.GetResourceByID(id);

            // Zugriffsberechtigung prüfen
            if (!(MyUser.IsAdmin || currentResource.Owner.ID == MyUser.ID))
                return View("Shared/_PermissionDenied");

            resource.ID = id;
            resource.Category = "Buch"; // category wird immer auf Buch gesetzt
            resource.Owner = currentResource.Owner;

            if (ModelState.IsValid)
            {
                resColl.UpdateResource(resource);
            }
            else
            {
                return View(resource);
            }

            return RedirectToAction("Index", "MyResources");
        }

    }
}
